tree
       = {{"t",  {"h",  "i"}}, 
         {{"m",  {" ",  "c"}}, 
           {{"e",  {"s",  "w"}},  "a"}}}

TreeForm[tree]

MakeString[n_Integer] := 
      (StringJoin @@ Table[" ", {n}]) <> "*"

\(\(ShowTree[binarytree_, Level_Integer] := 
      Module[{}, 

        If[\(! AtomQ[binarytree]\), \ 
				
          ShowTree[binarytree[\([2]\)], \ Level + 1]; 
				
          Print[MakeString[Level]]; 
				
          ShowTree[binarytree[\([1]\)], \ Level + 1], 
	\ \ \ \ \ \ \ 
          Print[SequenceForm[MakeString[Level], binarytree]]]]; \)\)

ShowTree[tree, 0]

tree = tree  /.  " " -> "bl"

Depth[tree]

Flatten[tree]

Length[Flatten[tree]]

Map[Position[tree, #]&,  tree]

MapIndexed[g, tree,  Infinity]

%[[1]]

\(makelines[tree_] := 
      Module[{d, l, lns, tlp, ql, q, e, r\ , e1, e2, e1l, e2l}, 
		
        d = Depth[tree]; 
		l = Length[Flatten[tree]]; 
		lns = {}; 
        tlp = {}; 
		ql = {{tree, {Ceiling[l/2] + 2, \ d + 2}\ }}; 
		
        While[\ ql =!= \ {}, \ 
			q = ql[\([1]\)]; 
			
          e = q[\([1]\)]; r = q[\([2]\)]; 
			
          If[\(! AtomQ[e]\), 
				\ \ \ \ \ e1 = e[\([1]\)]; 
            e2 = e[\([2]\)]; 
	\ 
            If[\(! AtomQ[e1]\), \ e1l = Length[Flatten[e1]] + Depth[e1], \ 
              e1l = 1]; 
			\ \ \ 
            If[\(! AtomQ[e2]\), \ e2l = Length[Flatten[e2]] + Depth[e2], \ 
              e2l = 1]; 
							\ \ \ \ \ 
            AppendTo[lns, {r, {r[\([1]\)] - e1l, \ r[\([2]\)] - 1}}]; 
			
            AppendTo[ql, {e1, {r[\([1]\)] - e1l, \ r[\([2]\)] - 1}}]; 

            						
            AppendTo[lns, {r, \ {r[\([1]\)] + e2l, \ r[\([2]\)] - 1}}]; 
		
            AppendTo[ql, {e2, {r[\([1]\)] + e2l, \ r[\([2]\)] - 1}}], \ 

            				\ \ \ \ 
            AppendTo[tlp, {e, \ {r[\([1]\)], \ r[\([2]\)] - 0.3}}]]; 
			
          ql = Rest[ql]]; 
				{lns, tlp}]\)

\(makeedges[tree_] := 
      Module[{d, l, edges, txt, queue, q, t, r\ , tl, tr, ld1, ld2}, 
		
        d = Depth[tree]; 	l = Length[Flatten[tree]]; 
		edges = {}; \ 
        txt = {}; 
		queue = {{tree, {Ceiling[l/2] + 2, \ d + 2}\ }}; 

        		While[\ queue =!= \ {}, \ 
			q = queue[\([1]\)]; 	
          t = q[\([1]\)]; \ r = q[\([2]\)]; 
			
          If[\(! AtomQ[t]\), 
				\ \ \ \ \ tl = t[\([1]\)]; 
            tr = t[\([2]\)]; 
	\ \ \ \ \ \ \ \ \ \ \ \ 
            If[\(! AtomQ[tl]\), 
					\ \ \ \ \ \ \ \ \ \ \ 
              ld1 = Length[Flatten[tl]] + Depth[tl], 

              					\ \ \ \ \ \ \ \ \ \ \ ld1 = 1]; 
			\ \ \ \ \ \ \ 
            If[\(! AtomQ[tr]\), 
					\ \ \ \ \ \ \ \ \ \ \ 
              ld2 = Length[Flatten[tr]] + Depth[tr], 

              					\ \ \ \ \ \ \ \ \ \ \ ld2 = 1]; 
						\ 
            AppendTo[edges, {r, {r[\([1]\)] - ld1, \ r[\([2]\)] - 1}}]; 

            		\ \ \ \ \ \ \ \ 	
            AppendTo[queue, {tl, {r[\([1]\)] - ld1, \ r[\([2]\)] - 1}}]; 

            						\ 
            AppendTo[edges, {r, \ {r[\([1]\)] + ld2, \ r[\([2]\)] - 1}}]; 

            		\ \ \ \ \ \ \ \ \ \ \ 
            AppendTo[queue, {tr, {r[\([1]\)] + ld2, \ r[\([2]\)] - 1}}], \ 

            				\ \ \ \ \ \ \ 
            AppendTo[txt, {t, \ {r[\([1]\)], \ r[\([2]\)] - 0.3}}]]; 

          			\ \ \ \ queue = Rest[queue]]; 
		{edges, \ txt}]\)

makeedges[tree]

edgesandchars = %;

edgeslist = edgesandchars[[1]]

textlist = edgesandchars[[2]]

Show[Graphics[Map[Line, edgeslist]],  Frame -> True,  
      GridLines -> Automatic]

Show[Graphics[Map[Text[#[[1]], #[[2]]]&, textlist]],  
      Axes -> True, DefaultFont -> {"Times", 12}]

g1 = Graphics[Map[Line, edgeslist]]

g2 = Graphics[Map[Text[#[[1]], #[[2]]]&, textlist]]

Show[g1, g2,  DefaultFont -> {"Times", 12},  Frame -> True]